icontheme: allow directories with mtime 0
authorDaniel Drake <drake@endlessm.com>
Mon, 23 Feb 2015 20:49:08 +0000 (14:49 -0600)
committerDaniel Drake <drake@endlessm.com>
Mon, 23 Feb 2015 21:09:15 +0000 (15:09 -0600)
In order to provide a constant mtime between OS build and deploy time,
while also maintaining a hardlink content-addressed model independent of
timestamps, ostree sets all mtimes to 0.

The icon cache code currently ignores directories with mtime 0, assuming
they don't exist.

Track directory existence in a more precise way.

https://bugzilla.gnome.org/show_bug.cgi?id=745052

gtk/gtkicontheme.c

index 7e2f8ed42b5eb01425813432b7018644f530916c..f47a95622a7f1359b31135186bbda7be5dc2c3f1 100644 (file)
@@ -315,8 +315,9 @@ typedef struct
 typedef struct 
 {
   gchar *dir;
-  time_t mtime; /* 0 == not existing or not a dir */
+  time_t mtime;
   GtkIconCache *cache;
+  gboolean exists;
 } IconThemeDirMtime;
 
 static void         gtk_icon_theme_finalize   (GObject          *object);
@@ -1133,10 +1134,13 @@ insert_theme (GtkIconTheme *icon_theme,
       dir_mtime = g_slice_new (IconThemeDirMtime);
       dir_mtime->cache = NULL;
       dir_mtime->dir = path;
-      if (g_stat (path, &stat_buf) == 0 && S_ISDIR (stat_buf.st_mode))
+      if (g_stat (path, &stat_buf) == 0 && S_ISDIR (stat_buf.st_mode)) {
         dir_mtime->mtime = stat_buf.st_mtime;
-      else
+        dir_mtime->exists = TRUE;
+      } else {
         dir_mtime->mtime = 0;
+        dir_mtime->exists = FALSE;
+      }
 
       priv->dir_mtimes = g_list_prepend (priv->dir_mtimes, dir_mtime);
     }
@@ -1370,11 +1374,13 @@ load_themes (GtkIconTheme *icon_theme)
       
       dir_mtime->dir = g_strdup (dir);
       dir_mtime->mtime = 0;
+      dir_mtime->exists = FALSE;
       dir_mtime->cache = NULL;
 
       if (g_stat (dir, &stat_buf) != 0 || !S_ISDIR (stat_buf.st_mode))
         continue;
       dir_mtime->mtime = stat_buf.st_mtime;
+      dir_mtime->exists = TRUE;
 
       dir_mtime->cache = _gtk_icon_cache_new_for_path (dir);
       if (dir_mtime->cache != NULL)
@@ -2714,12 +2720,12 @@ rescan_themes (GtkIconTheme *icon_theme)
       stat_res = g_stat (dir_mtime->dir, &stat_buf);
 
       /* dir mtime didn't change */
-      if (stat_res == 0 &&
+      if (stat_res == 0 && dir_mtime->exists &&
           S_ISDIR (stat_buf.st_mode) &&
           dir_mtime->mtime == stat_buf.st_mtime)
         continue;
       /* didn't exist before, and still doesn't */
-      if (dir_mtime->mtime == 0 &&
+      if (!dir_mtime->exists &&
           (stat_res != 0 || !S_ISDIR (stat_buf.st_mode)))
         continue;
 
@@ -3314,7 +3320,7 @@ theme_subdir_load (GtkIconTheme *icon_theme,
     {
       dir_mtime = (IconThemeDirMtime *)d->data;
 
-      if (dir_mtime->mtime == 0)
+      if (!dir_mtime->exists)
         continue; /* directory doesn't exist */
 
       full_dir = g_build_filename (dir_mtime->dir, subdir, NULL);